﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;


//构造函数
//class Data
//{
//public:
//	//无参构造
//	/*Data()
//	{
//		_year = 1;
//		_month = 1;
//		_day = 1;
//	}*/
//	//带参构造
//	//Data(int year, int month, int day = 1)
//	//{
//	//	_year = year;
//	//	_month = month;
//	//	_day = day;
//	//}
//	//全缺省构造
//	Data(int year = 2, int month = 2, int day = 2)
//	{
//		_year = year;
//		_month = month;
//		_day = day;
//	}
	/*void Print()
	{
		cout << _year << "/" << _month << "/" << _day << endl;
	}*/
//private:
//	int _year;
//	int _month;
//	int _day;
//};
//int main()
//{
//	//无参
//	/*Data d1;
//	d1.Print();*/
//	//带参
//	/*Data d2(2025, 4);
//	d2.Print();*/
//	//全缺省
//	Data d3(2025, 4, 22);
//	d3.Print();
//	//不写构造函数，输出随机值
//	/*Data d4;
//	d4.Print();*/
//
//	return 0;
//}

//两个栈实现队列
//class Stack
//{
//public:
//	Stack(int n = 4)
//	{
//		_a = (int*)malloc(sizeof(int) * n);
//		if (nullptr == _a)
//		{
//			perror("malloc fail");
//			return;
//		}
//		_top = 0;
//		_capacity = n;
//	}
// ~Stack()
//{
//	cout << "~Stack()" << endl;
//	free(_a);
//	_a = nullptr;
//	_top = _capacity = 0;
//}
//private:
//	int* _a;
//	int _top;
//	int _capacity;
//};
//class MyQueue
//{
//public:
//	//编译器默认⽣成MyQueue的构造函数调⽤了Stack的构造，完成了两个成员的初始化
//	 //编译器默认⽣成MyQueue的析构函数调⽤了Stack的析构，释放的Stack内部的资源
//	 // 显⽰写析构，也会⾃动调⽤Stack的析构
//	~MyQueue()
//	{
//
//	}
//private:
//	Stack pushst;
//	Stack popst;
//};
//
//int main()
//{
//	Stack st;
//	MyQueue mq;
//}

//拷贝构造函数
//class Data
//{
//public:
//	Data(int year = 2, int month = 2, int day = 2)
//	{
//		_year = year;
//		_month = month;
//		_day = day;
//	}
//	//不写也行
//	Data(const Data& d)
//	{
//		_year = d._year;
//		_month = d._month;
//		_day = d._day;
//	}
//	void Print()
//	{
//		cout << _year << "/" << _month << "/" << _day << endl;
//	}
//private:
//	int _year;
//	int _month;
//	int _day;
//};
//
//int main()
//{
//	Data d1(2025, 4, 22);
//	d1.Print();
//
//	//Data d2(d1);
//	Data d2 = d1;
//	d2.Print();
//}

//拷贝构造---栈
//class Stack
//{
//public:
//	Stack(int n = 4)
//	{
//		_a = (int*)malloc(sizeof(int) * n);
//		if (nullptr == _a)
//		{
//			perror("malloc fail");
//			return;
//		}
//		_top = 0;
//		_capacity = n;
//	}
//	~Stack()
//	{
//		cout << "~Stack()" << endl;
//		free(_a);
//		_a = nullptr;
//		_top = _capacity = 0;
//	}
//	d是s1，也就是被拷贝对象
//	Stack(const Stack& d)
//	{
//		_a = (int*)malloc(sizeof(int) * d._capacity);
//		{
//			if (nullptr == _a)
//			{
//				perror("malloc fail");
//				return;
//			}
//		}
//		memcpy(_a, d._a, sizeof(int) * d._top);
//		_top = d._top;
//		_capacity = d._capacity;
//	}
//private:
//	int* _a;
//	int _top;
//	int _capacity;
//};
//int main()
//{
//	Stack s1(10);
//	Stack s2 = s1;
//	return 0;
//}

//运算符重载
//class Data
//{
//public:
//	Data(int year = 1, int month = 1, int day = 1)
//	{
//		_year = year;
//		_month = month;
//		_day = day;
//	}
//	void Print()
//	{
//		cout << _year << "/" << _month << "/" << _day << endl;
//	}
//	bool operator==(const Data& d2)
//	{
//		return _year == d2._year
//			&& _month == d2._month
//			&& _day == d2._day;
//	}
//	int GetMonthDay(int year,int month)
//	{
//		int arr[13] = { 0,31,28,31,30,31,30,31,31,30,31,31,31};
//		if (month == 2 && year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
//		{
//			return 29;
//		}
//		return arr[month];
//	}
//	void operator+=(int x)
//	{
//		_day += x;
//		while (_day > GetMonthDay(_year, _month))
//		{
//			_day -= GetMonthDay(_year, _month);
//			_month++;
//			if (_month == 13)
//			{
//				_year++;
//				_month = 1;
//			}
//		}
//	}
//private:
//	int _year;
//	int _month;
//	int _day;
//};
//int main()
//{
//	Data d1(2025, 4, 22);
//	d1.Print();
//	Data d2(2025, 4, 22);
//	d1.Print();
//	if (d1 == d2)
//		printf("hehe");
//	else
//		printf("zhzha");
//	Data d3(2025, 4, 22);
//	d3.Print();
//	d3 += 100;
//	d3.Print();
//}


//赋值运算符重载
class Data
{
public:
	Data(int year = 1, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	//拷贝构造
	Data(const Data& d)
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
	}
	//赋值运算符重载
	//传引用减少拷贝
	//d1 = d2    这里的d是d2
	Data& operator=(const Data& d)
	{
		//
		if (this != &d)
		{
			_year = d._year;
			_month = d._month;
			_day = d._day;
		}
		//返回d1
		return *this;
	}
	void Print()
	{
		cout << _year << "/" << _month << "/" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Data d1(2025, 4, 22);
	//拷贝构造
	Data d2(d1);

	Data d3(2024, 4, 22);
	d1 = d3;//赋值重载，因为d1和d2都已经存在

	Data d4 = d1;//拷贝构造
}